/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ces31.ChineseDicesClient.RN;

import ces31.ChineseDicesClient.SO_SistemaCliente;
import ces31.ChineseDicesClient.SO_SistemaCliente_Facade;
import ces31.ChineseDicesCommon.ClienteInterface;
import ces31.ChineseDicesCommon.ServidorInterface;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.rmi.Naming;
import java.rmi.registry.Registry;

/**
 *
 * @author Anderson Aiziro
 */
public class RN_SalaDeEspera extends RN_SalaDeEspera_Subject {
/*
 *
    private static String createPolicyPath() {
        StringBuffer str = new StringBuffer(System.getProperty("user.dir"));
        if (str.charAt(0) == 'C') {
            str.setCharAt(0, ':');
            str.setCharAt(1, '\\');
            return "file" + str.toString();
        }
        return "file:/" + str.toString();
    }*/


/**
 * Caso de Uso: Iniciar Conexao
 * Ator: Jogador
 * @param name
 */

    public String conectarseAoServidor(String name){
        setNomeUsuario(name);
        try{
            /*COMECO DO PATH ---> file:\\Users\\Anderson Aiziro\\Documents\\NetBeansProjects\\chineseDices*/
            //  System.setProperty("java.security.policy", createPolicyPath() + File.separator +"client.policy");
            //   System.out.println(System.getProperty("java.security.policy"));

            //System.setProperty("java.rmi.client.codebase", /*getPath()+*/  "file:\\Users\\Anderson Aiziro\\Documents\\NetBeansProjects\\chineseDices\\build\\classes");

            // System.setSecurityManager(new RMISecurityManager());
            Registry r = java.rmi.registry.LocateRegistry.createRegistry(ClienteInterface.port);
            r.rebind(ClienteInterface.bindname, SO_SistemaCliente_Facade.getSO_SistemaCliente_Facade());

        } catch (Exception e) {
            setMensagem("Erro no Binding do Cliente");
            //notifyNewMessageToObservers();
            return mensagem;
        }

        try {
            String address = ("rmi://" + getIPDoServidor() + ":" + ServidorInterface.port + "/" + ServidorInterface.bindname);
            setServidorInterface((ServidorInterface) Naming.lookup(address));
            getServidorInterface().conectarJogador(getIPdoCliente(), getNomeUsuario());
        } catch (Exception e) {
            e.printStackTrace();
            setMensagem("Erro na Conexao com o Servidor");
            //notifyNewMessageToObservers();
            return mensagem;
        }
        return null;
    }

 /**
 * Caso de Uso: Remover jogador da Sala de Espera
  * Ator: Jogador
 * @throws java.lang.Throwable
 */ 

    public void desconectarCliente() throws Throwable {

        getServidorInterface().desconectarJogador(getNomeUsuario());
        Registry r;
        try {
            r = java.rmi.registry.LocateRegistry.getRegistry(ClienteInterface.port);
            r.unbind(ClienteInterface.bindname);
        } catch (Exception ex) {
            //setMensagem("Erro ao Sair da Sala de Espera");
            //notifyNewMessageToObservers();
        }
        SO_SistemaCliente.encerrarCliente();
    }



/**
 * Obtem o IP do servidor, que estará armazenado em um arquivo de texto presente no diretorio do usuario
 * @return
 */
    private String getIPDoServidor() {
        try {
            BufferedReader filereader = new BufferedReader(new InputStreamReader(SO_SistemaCliente.class.getResourceAsStream("/IPServerFile.txt")));
            return filereader.readLine();
        } catch (Exception evt) {
            setMensagem("Erro ao pegar o IP do Servidor");
            notifyNewMessageToObservers();
        }
        return null;
    }
/**
 * Obtem o IP do usuario, que sera fornecido ao servidor.
 * @return
 */
    public String getIPdoCliente() {
        try {
            IPDoUsuario = InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException evt) {
            setMensagem("Erro ao pegar o IP do Usuario");
            notifyNewMessageToObservers();
            IPDoUsuario = null;
        }
        return IPDoUsuario;
    }

    public ServidorInterface getServidorInterface() {
        return servidorInterface;
    }

    private void setServidorInterface(ServidorInterface serverInterface) {
        this.servidorInterface = serverInterface;
    }

    public String getNomeUsuario() {
        return nomeUsuario;
    }

    public void setNomeUsuario(String name) {
        this.nomeUsuario = name;
    }
    private String IPDoUsuario;

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String message) {
        this.mensagem = message;
    }
    private String mensagem;
    private String nomeUsuario;
    private ServidorInterface servidorInterface;

}
